#include "media_sys.h"

bool delete_mode = false;

// 显示图片张数的函数
bool Show_Photo_Count(MEDIA_POI mp, int photo_sum) 
{
    char count_str[20];
    sprintf(count_str, "%d", photo_sum);

    int text_x = 600; // 右上角的 x 坐标
    int text_y = 10;  // 右上角的 y 坐标

    for(int i = 0; i < strlen(count_str); i++) 
    {
        if (Char_Show(count_str[i], text_x, text_y) == false) {
            printf("显示图片张数失败！\n");
            return false;
        }
        text_x += 16; 
    }
    return true;
}

bool Album(MEDIA_POI mp) // 相册总接口
{

    P_AI p_ai = Album_Init(mp);
    if (p_ai == (P_AI)-1)
    {
        printf("相册模块初始化失败！\n");
        return false;
    }

    if (Album_Touch_Ctrl(mp, p_ai) == false)
    {
        printf("相册触摸屏控制失败！\n");
        return false;
    }
    
    return true;
}

P_AI Album_Init(MEDIA_POI mp) // 被相册总接口Album调用
{

    // 显示相册界面
    //  if(Show_Ui(mp,"/ui/alb_ui.bmp") == false)
    //  {
    //      printf("显示相册界面失败！\n");
    //      return false;
    //  }

    Lcd_Clean(mp, 0x00ffffff);

    // 申请相册结构体堆空间
    P_AI p_ai = (P_AI)malloc(sizeof(AI));
    if (p_ai == (P_AI)NULL)
    {
        perror("malloc ...");
        return (P_AI)-1;
    }

    memset(p_ai, 0, sizeof(AI));

    // 创建图片链表头节点
    if ((p_ai->bmp_list_head = Create_Bmp_Node()) == (BMP_LINK)-1) // 创建图片链表头结点
    {
        printf("创建图片链表头结点失败！\n");
        return (P_AI)-1;
    }

    // 相册bmp检索
    if (Bmp_File_Search(p_ai) == false)
    {
        printf("bmp图片检索失败！\n");
        return (P_AI)-1;
    }

    // 默认显示第一页缩略图
    if (Show_Page_Thumbnail(mp, p_ai, 1) == false)
    {
        printf("显示缩略图失败！\n");
        return (P_AI)-1;
    }

    // 显示图片张数
    if (!Show_Photo_Count(mp, p_ai->photo_sum)) 
    {
        printf("显示图片张数失败！\n");
    }

    show_btn(mp);
    return p_ai;
}

BMP_LINK Create_Bmp_Node()
{
    BMP_LINK new_node = (BMP_LINK)malloc(sizeof(BMP_NODE));
    if (new_node == (BMP_LINK)NULL)
    {
        perror("malloc bmp node ...");
        return (BMP_LINK)-1;
    }

    memset(new_node, 0, sizeof(BMP_NODE));

    new_node->next = new_node;
    new_node->prev = new_node;

    return new_node;
}

bool Bmp_File_Search(P_AI p_ai) // bmp图片的检索
{
    // 打开存放相册图片的目录
    DIR *dp = opendir(DEFAULT_SEARCH_BMP_PATH);
    if (dp == (DIR *)NULL)
    {
        perror("opendir ...");
        return false;
    }

    // 死循环读取文件名字，
    while (1)
    {
        struct dirent *eq = readdir(dp);
        if (eq == (struct dirent *)NULL)
        {
            printf("-----\n");
            break;
        }

        // 忽略.和..
        if (eq->d_name[0] == '.')
            continue;

        // 如果是.bmp,倒数第四个字符的下标 = strlen(eq->d_name)-4  -1 p -2 m -3 b -4 .

        if ((eq->d_type == DT_REG) && (strcmp(&eq->d_name[strlen(eq->d_name) - 4], PIC_FILE_TYPE) == 0))
        {

            // 创建一个节点
            BMP_LINK bmp_node = Create_Bmp_Node();
            if (bmp_node == (BMP_LINK)-1)
            {
                printf("创建图片结点失败！\n");
                return false;
            }

            // 保存他的文件路径到节点的bmp_path，
            sprintf(bmp_node->bmp_path, "%s/%s", DEFAULT_SEARCH_BMP_PATH, eq->d_name);

            // 头插到链表中
            if (Add_Bmp_Node(p_ai, bmp_node) == false)
            {
                printf("添加图片链表节点失败！\n");
                return false;
            }

            p_ai->photo_sum++; // 图片数量+1
        }
    }

    // 跳出while之后，p_ai->photo_sum就是图片的总数，通过图片的总数去求页数
    if (p_ai->photo_sum % 9 == 0)
    {
        p_ai->photo_page_sum = p_ai->photo_sum / 9;
    }
    else
    {
        p_ai->photo_page_sum = p_ai->photo_sum / 9 + 1;
    }

    printf("检索相册图片成功，个数:%d张，页数:%d页，文件如下：\n", p_ai->photo_sum, p_ai->photo_page_sum);
    // 关闭目录
    if (closedir(dp) == -1)
    {
        perror("closedir ...");
        return false;
    }
    return true;
}

bool Add_Bmp_Node(P_AI p_ai, BMP_LINK new_node) // 头插法添加图片链表节点
{
    if (p_ai == (P_AI)NULL || p_ai->bmp_list_head == (BMP_LINK)NULL)
    {
        printf("地址异常！\n");
        return false;
    }

    new_node->prev = p_ai->bmp_list_head->prev;
    p_ai->bmp_list_head->prev->next = new_node;

    new_node->next = p_ai->bmp_list_head;

    p_ai->bmp_list_head->prev = new_node;

    return true;
}

bool Show_Page_Thumbnail(MEDIA_POI mp, P_AI p_ai, int page_num) // 指定显示某一页的缩略图
{
    // 如果page  等于1  不用循环
    // 如果page 等于 2 也就是第10张开始后面的9张，写一个for循环9次
    // 如果page 等于 3 写一个for循环18次

    // 获取指定页数在链表的中第一张缩略图的图片节点
    int loop_num = (page_num - 1) * 9;

    BMP_LINK obj_bmp_node = p_ai->bmp_list_head->next;

    for (int index = 0; index < loop_num; index++)
    {
        obj_bmp_node = obj_bmp_node->next;
    }

    int bmp_x = 15;
    int bmp_y = 30;
    // 循环9 次 显示9张缩略图 ，如果当前页数的图片数量不满 9 张 提前 跳出循环
    for (int index = 0; index < 9; index++, obj_bmp_node = obj_bmp_node->next)
    {
        if (obj_bmp_node == p_ai->bmp_list_head)
            break;

        // 显示当前节点对应的图片的缩略图
        if (Show_One_Thumbnail(mp, obj_bmp_node->bmp_path, 4, bmp_x, bmp_y) == false)
        {
            printf("显示缩略图失败！\n");
            return false;
        }

        // 提取图片名字
        char *filename = strrchr(obj_bmp_node->bmp_path, '/');
        if (filename == NULL)
        {
            filename = obj_bmp_node->bmp_path;
        } 
        else
        {
            filename++;
        }

        // 计算文字显示的位置，在缩略图下方
        int text_x = bmp_x;
        int text_y = bmp_y + 120; // 假设缩略图高度为120像素

        // 显示图片名字
        for(int i = 0; i < strlen(filename); i++)
        {
            if (Char_Show(*(filename+i) ,text_x, text_y) == false)
            {
                printf("error\n");
                return false;
            }
            
            text_x += 16; 
        }


        bmp_x += 220;
        if (bmp_x > 481)
        {
            bmp_x = 15;
            bmp_y += 140;
        }
    }

    return true;
}

bool Show_One_Thumbnail(MEDIA_POI mp, const char *bmp_path, int zoomout, int bmp_x, int bmp_y)
{

    int *tmp_mmap_p = mp->mmap_start_poi + mp->lcd_w * bmp_y + bmp_x;
    // 打开图片
    int bmp = open(bmp_path, O_RDONLY);
    if (bmp == -1)
    {
        perror("bmp ...");
        return false;
    }

    // 获取图片w和h
    int bmp_w, bmp_h;
    lseek(bmp, 18, SEEK_SET);
    if (read(bmp, &bmp_w, sizeof(int)) == -1)
    {
        perror("Read w ...");
        return false;
    }

    if (read(bmp, &bmp_h, sizeof(int)) == -1)
    {
        perror("Read h ...");
        return false;
    }

    if (bmp_w < 800 || bmp_h < 480)
    {
        int x, y;
        x = (800 - bmp_w) / 2;
        y = (480 - bmp_h) / 2;
        tmp_mmap_p = tmp_mmap_p + 800 * y + x;
    }

    // 计算skip
    int skip = 0;
    if (bmp_w * 3 % 4 != 0)
    {
        skip = 4 - (bmp_w * 3 % 4);
    }

    // 定义数组
    int bmp_size = bmp_w * bmp_h * 3 + bmp_h * skip;
    // printf("即将缩小%d倍显示宽：%d-高：%d的%s图片--- %d\n",zoomout,bmp_w,bmp_h,bmp_path,skip);

    char rgb[bmp_size];

    // read读取图片像素点 + 补齐字节数
    lseek(bmp, 54, SEEK_SET);

    if (read(bmp, rgb, bmp_size) == -1)
    {
        perror("read ...");
        return false;
    }

    for (int y = 0, n = 0; y < bmp_h / zoomout; y++)
    {

        for (int x = 0; x < bmp_w / zoomout; x++, n += (3 * zoomout))
        {

            *(tmp_mmap_p + 800 * (bmp_h / zoomout - 1 - y) + x) = rgb[n] << 0 | rgb[n + 1] << 8 | rgb[n + 2] << 16;
        }

        // 跳补数
        n += skip;

        // 需要跳剩余的像素点字节数
        n += (bmp_w % zoomout) * 3;

        // 跳行数 跳 zoomout-1行数 字节数
        n += bmp_w * (zoomout - 1) * 3 + skip * (zoomout - 1);
    }

    if (close(bmp) == -1)
    {
        perror("close ...");
        return false;
    }


    return true;
}

//显示图标按钮
bool show_btn(MEDIA_POI mp)
{
    if (mp == NULL)
    {
        printf("项目总节点异常\n");
        return false;
    }

    show_bmp(mp, "/tmp/icon/exit.bmp", 681, 60);     //退出
    show_bmp(mp, "/tmp/icon/previous.bmp", 681, 160);//上一页
    show_bmp(mp, "/tmp/icon/next.bmp", 681, 260);    //下一页
    show_bmp(mp, "/tmp/icon/delete.bmp", 681, 360); // 添加删除按钮

    return true;
}

bool show_bmp(MEDIA_POI mp, const char *path, int x, int y)
{
    int fd = open(path, O_RDONLY);
    if (fd == -1)
    {
        perror("open ..");
        return -1;
    }

    int w, h;
    lseek(fd, 18, SEEK_SET);
    read(fd, &w, 4);
    read(fd, &h, 4);

    int skip = 0;
    // 通过像素点宽度去计算字节宽度能不能被4整除
    if (w * 3 % 4 != 0)
    {
        // 为真则不能整除。求每一行的补的字节数
        skip = 4 - (w * 3 % 4);
    }

    unsigned char rgb[w * h * 3 + skip * h];
    memset(rgb, 255, w * h * 3);
    lseek(fd, 54, SEEK_SET);
    read(fd, rgb, w * h * 3);

    int *tmp_p = mp->mmap_start_poi + mp->lcd_w * y + x;

    for (int y1 = 0, n = 0; y1 < h; y1++)
    {
        for (int x1 = 0; x1 < w; x1++, n += 3)
        {
            *(tmp_p + (h - 1 - y1) * 800 + x1) =
                rgb[n] << 0 | rgb[1 + n] << 8 | rgb[2 + n] << 16;
        }
        n += skip;
    }

    if (close(fd) == -1)
    {
        perror("close ..");
        return false;
    }
    return true;
}

// 相册界面触摸控制
bool Album_Touch_Ctrl(MEDIA_POI mp, P_AI p_ai) 
{
    int page_num = 1;
    int x, y, x1, y1, ret_value;

    while (1)
    {
        // 先获取点击的触摸坐标，再去判断坐标是哪个按钮的区间
        ret_value = get_touch_action(mp, &x, &y, &x1, &y1);
        if (ret_value == -1)
        {
            printf("读取触摸屏坐标失败！\n");
            return false;
        }

        if (ret_value == 1 && page_num > 1) // 左划 上一页
        {
            printf("上一页 !\n");
            part_clean(mp, 0x00ffffff, 0, 0, 681, 480);
            if (Show_Page_Thumbnail(mp, p_ai, --page_num) == false)
            {
                printf("显示缩略图失败！\n");
                return (P_AI)-1;
            }
            // show_btn(mp, 681, 30);
        }

        if (ret_value == 0 && page_num < p_ai->photo_page_sum) // 右划 下一页
        {
            printf("下一页 !\n");
            part_clean(mp, 0x00ffffff, 0, 0, 681, 480); // 只让图片显示那边清屏

            if (Show_Page_Thumbnail(mp, p_ai, ++page_num) == false)
            {
                printf("显示缩略图失败！\n");
                return (P_AI)-1;
            }
            // show_btn(mp, 681, 30);
        }
        if (ret_value == 2) // 点击
        {
            if (x > 681 && x < 787 && y > 160 && y < 250 && page_num > 1) // 上一页
            {
                printf("上一页 !\n");
                part_clean(mp, 0x00ffffff, 0, 0, 681, 480); // 只让图片显示那边清屏
                if (Show_Page_Thumbnail(mp, p_ai, --page_num) == false)
                {
                    printf("显示缩略图失败！\n");
                    return (P_AI)-1;
                }
                // 显示图片张数
                if (!Show_Photo_Count(mp, p_ai->photo_sum)) 
                {
                    printf("显示图片张数失败！\n");
                }
                // show_btn(mp, 681, 30);
            }

            if (x > 681 && x < 787 && y > 260 && y < 350 && page_num < p_ai->photo_page_sum) // 下一页
            {
                printf("下一页 !\n");
                part_clean(mp, 0x00ffffff, 0, 0, 681, 480);

                if (Show_Page_Thumbnail(mp, p_ai, ++page_num) == false)
                {
                    printf("显示缩略图失败！\n");
                    return (P_AI)-1;
                }
                // 显示图片张数
                if (!Show_Photo_Count(mp, p_ai->photo_sum)) 
                {
                    printf("显示图片张数失败！\n");
                }
                // show_btn(mp, 681, 30);
            }

            if (x > 681 && x < 787 && y > 360 && y < 450) // 删除按钮点击
            {
                printf("点击删除按钮！\n");
                delete_mode = !delete_mode; // 切换删除模式
            }

            if (delete_mode && x > 10 && x < 681 && y > 30 && y < 430)
            { // 点击图片删除
                int row = -1;
                int column = -1; // 记录点击那张图片在第几行第几列

                if (y > 30 && y < 150)
                    row = 0;
                if (y > 170 && y < 290)
                    row = 1;
                if (y > 310 && y < 430)
                    row = 2;

                if (x > 15 && x < 200)
                    column = 1;
                if (x > 220 && x < 420)
                    column = 2;
                if (x > 440 && x < 640)
                    column = 3;

                int loop_num = (page_num - 1) * 9;
                // 获取指定页数在链表的中第一张缩略图的图片节点
                BMP_LINK obj_bmp_node = p_ai->bmp_list_head->next;

                for (int index = 0; index < loop_num; index++)
                {
                    obj_bmp_node = obj_bmp_node->next;
                }

                // 跳到要删除图片的节点
                for (int i = 0; i < (row * 3 + column) - 1; i++, obj_bmp_node = obj_bmp_node->next)
                {
                    if (obj_bmp_node == p_ai->bmp_list_head)
                        break;
                }

                if (obj_bmp_node != p_ai->bmp_list_head) 
                {
                    // 从链表中移除节点
                    obj_bmp_node->prev->next = obj_bmp_node->next;
                    obj_bmp_node->next->prev = obj_bmp_node->prev;

                    // 删除文件
                    if (remove(obj_bmp_node->bmp_path) != 0) 
                    {
                        perror("删除文件失败");
                    }

                    // 释放节点内存
                    free(obj_bmp_node);

                    // 更新图片总数和页数
                    p_ai->photo_sum--;
                    if (p_ai->photo_sum % 9 == 0)
                    {
                        p_ai->photo_page_sum = p_ai->photo_sum / 9;
                    }
                    else
                    {
                        p_ai->photo_page_sum = p_ai->photo_sum / 9 + 1;
                    }

                    // 更新界面
                    part_clean(mp, 0x00ffffff, 0, 0, 681, 480);
                    if (Show_Page_Thumbnail(mp, p_ai, page_num) == false)
                    {
                        printf("显示缩略图失败！\n");
                        return false;
                    }
                    show_btn(mp);
                    // 显示图片张数
                    if (!Show_Photo_Count(mp, p_ai->photo_sum)) 
                    {
                        printf("显示图片张数失败！\n");
                    }
                }
            }

            if (x > 10 && x < 681 && y > 30 && y < 430 && !delete_mode)
            { // 点击图片放大显示
                int row = -1;
                int column = -1; // 记录点击那张图片在第几行第几列

                if (y > 30 && y < 150)
                    row = 0;
                if (y > 170 && y < 290)
                    row = 1;
                if (y > 310 && y < 430)
                    row = 2;

                if (x > 15 && x < 200)
                    column = 1;
                if (x > 220 && x < 420)
                    column = 2;
                if (x > 440 && x < 640)
                    column = 3;

                int loop_num = (page_num - 1) * 9;
                // 获取指定页数在链表的中第一张缩略图的图片节点
                BMP_LINK obj_bmp_node = p_ai->bmp_list_head->next;

                for (int index = 0; index < loop_num; index++)
                {
                    obj_bmp_node = obj_bmp_node->next;
                }

                if (page_num < p_ai->photo_page_sum) // 判断是不是最后一页，不是则进入
                {
                    for (int i = 0; i < (row * 3 + column) - 1; i++, obj_bmp_node = obj_bmp_node->next)
                    {
                        if (obj_bmp_node == p_ai->bmp_list_head)
                            break;
                    }
                    printf("%d\n", row * 3 + column);

                    row = -1;
                    column = -1;
                    // part_clean(mp, 0x00ffffff, 0, 0, 680, 480);
                    Show_One_Thumbnail(mp, obj_bmp_node->bmp_path, 1, 0, 0);
                    Zoom_Show_left_right_strokes(mp, p_ai, obj_bmp_node);
                    Lcd_Clean(mp,0x00ffffff);
                    Show_Page_Thumbnail(mp,p_ai,page_num);
                    show_btn(mp);
                }
                else // 是最后一页则进入else
                {
                    // 跳到要显示图片的节点
                    for (int i = 0; i < (row * 3 + column) - 1; i++, obj_bmp_node = obj_bmp_node->next)
                    {
                        if (obj_bmp_node == p_ai->bmp_list_head)
                            break;
                    }
                    // 最后一页的图片数有可能是界面最大显示图片数，也有可能是小于最大显示图片数，不管是多少，点击的那张图片都不能超过最后一页的图片数
                    if ((p_ai->photo_sum % 9) >= (row * 3 + column) || (p_ai->photo_sum % 9 == 0))
                    {
                        // part_clean(mp, 0x00ffffff, 0, 0, 680, 480);
                        Show_One_Thumbnail(mp, obj_bmp_node->bmp_path, 1, 0, 0);
                        Zoom_Show_left_right_strokes(mp, p_ai, obj_bmp_node);
                        Lcd_Clean(mp, 0x00ffffff);
                        Show_Page_Thumbnail(mp, p_ai, page_num);
                        show_btn(mp);
                        // Show_One_Thumbnail(mp, obj_bmp_node->bmp_path, 2, 120, 120);
                        // Zoom_Show_bmp(mp, obj_bmp_node->bmp_path, 0.8, 20, 48); // 双线性插值法缩放

                    }
                    row = -1;
                    column = -1;
                }
            }

            if (x > 681 && x < 771 && y > 60 && y < 150) // 退出返回主界面
            {
                // 显示主界面
                if (Show_Ui(mp, "/tmp/main_ui.bmp") == false)
                {
                    printf("显示主界面失败！\n");
                    return false;
                }

                x = -1;
                y = -1;
                break;
            }
        }
    }

    return true;
}

// 部分屏幕刷指定颜色
bool part_clean(MEDIA_POI mp, int color, int x1, int y1, int x2, int y2)
{
    if (mp == NULL)
    {
        printf("mp节点为空\n");
        return false;
    }

    for (int y = y1; y < y2; y++)
    {
        for (int x = x1; x < x2; x++)
        {
            *(mp->mmap_start_poi + y * 800 + x) = color;
        }
    }

    return true;
}

//放大图片
void Zoom_Show_bmp(MEDIA_POI mp, const char *pathname, double pzoom, int x, int y)
{
    unsigned char *mmap_t = (unsigned char *)mp->mmap_start_poi;
    mmap_t = mmap_t + y * 800 * 4 + x * 4;
    // 打开图片
    int fp1 = open(pathname, O_RDWR);

    if (fp1 == -1)
    {
        printf("Opening photos failed!\n");
        if (fp1 == -1)
            close(fp1);
        return;
    }

    // 得到原图宽高和修改后的宽高
    unsigned int oldWidth, oldHeight, newWidth, newHeight;
    oldWidth = 800;
    oldHeight = 480;

    unsigned int oldsize = oldWidth * oldHeight * 3, // byte = 3
        newsize = newWidth * newHeight * 3;

    // 获取原图位图数据
    unsigned char *sourceData = (unsigned char *)malloc(oldsize);

    lseek(fp1, 54, SEEK_SET); // 文件移动第54个字节
    read(fp1, sourceData, oldsize * 1);

    // unsigned char *destinationData;  // 开好新图片的位图数据所需空间

    // 计算放大倍数，以YY轴坐标做为倍数，y轴坐标：0~480
    // 由于暂定设置的图片全屏，所以图片只能设置为缩小显示，编放比例:
    printf("放大的倍：%0.1f\n", pzoom);

    if (pzoom < 0.1)
        pzoom = 0.1; // 最低缩小为0.1倍

    // 图像显示不出来原因在于图像长或宽不是4的倍数
    // 下面这一步可以保证得到的宽高是4的倍数
    newHeight = ((int)(oldHeight * pzoom) + 3) / 4 * 4;
    newWidth = ((int)(oldWidth * pzoom) + 3) / 4 * 4;

    // newHeight = (int)(oldHeight * pzoom);
    // newWidth = (int)(oldWidth * pzoom);
    oldsize = oldWidth * oldHeight * 3; // byte = 3
    newsize = newWidth * newHeight * 3;

    // 使用双线性差值法进行图片缩放
    double p, q;
    unsigned int x1, y1, x2, y2; // 原图所在像素点的宽高
    unsigned int X, Y;

    unsigned char a, b, c;
    unsigned char *pDestination = &a;             // 修改像素的位置（即字节偏移量）
    unsigned char *pSource1 = &b, *pSource2 = &c; // 获取像素的位置（即字节偏移量）

    // destinationData = (unsigned char *)malloc(newsize);  // 开好新图片的位图数据所需空间
    unsigned char destinationData[newsize];
    memset(destinationData, 0, newsize);
    int byte = 3;

    for (Y = 0; Y < newHeight; Y++)
    {
        y1 = Y / pzoom;
        y2 = Y / pzoom + 1;
        q = Y / pzoom - y1;
        pDestination = destinationData + Y * newWidth * 3;
        pSource1 = sourceData + y1 * oldWidth * 3;
        pSource2 = sourceData + y2 * oldWidth * 3;
        for (X = 0; X < newWidth; X++)
        {
            x1 = X / pzoom;
            x2 = X / pzoom + 1;
            p = X / pzoom - x1;
            if (byte == 3)
            {
                *(pDestination + X * 3) =
                    *(pSource1 + x1 * 3) * (1 - p) * (1 - q) +
                    *(pSource1 + x2 * 3) * p * (1 - q) +
                    *(pSource2 + x1 * 3) * (1 - p) * q +
                    *(pSource2 + x2 * 3) * p * q;

                *(pDestination + X * 3 + 1) =
                    *(pSource1 + x1 * 3 + 1) * (1 - p) * (1 - q) +
                    *(pSource1 + x2 * 3 + 1) * p * (1 - q) +
                    *(pSource2 + x1 * 3 + 1) * (1 - p) * q +
                    *(pSource2 + x2 * 3 + 1) * p * q;

                *(pDestination + X * 3 + 2) =
                    *(pSource1 + x1 * 3 + 2) * (1 - p) * (1 - q) +
                    *(pSource1 + x2 * 3 + 2) * p * (1 - q) +
                    *(pSource2 + x1 * 3 + 2) * (1 - p) * q +
                    *(pSource2 + x2 * 3 + 2) * p * q;
            }
            else if (byte == 1)
            {
                *(pDestination + X * 3) =
                    *(pSource1 + x1 * 3) * (1 - p) * (1 - q) +
                    *(pSource1 + x2 * 3) * p * (1 - q) +
                    *(pSource2 + x1 * 3) * (1 - p) * q +
                    *(pSource2 + x2 * 3) * p * q;
            }
        }
    }

    printf("zoom finish\n");
    for (int yyy = 0; yyy < newHeight; yyy++)
    {
        for (int xxx = 0; xxx < newWidth; xxx++)
        {
            // mmap_p[(start_y+y)*800+start_x+x] = buff[(high-y)*width+x];
            mmap_t[yyy * 800 * 4 + 4 * xxx + 0] = destinationData[(newHeight - 1 - yyy) * newWidth * 3 + 3 * xxx + 2];
            mmap_t[yyy * 800 * 4 + 4 * xxx + 1] = destinationData[(newHeight - 1 - yyy) * newWidth * 3 + 3 * xxx + 1];
            mmap_t[yyy * 800 * 4 + 4 * xxx + 2] = destinationData[(newHeight - 1 - yyy) * newWidth * 3 + 3 * xxx + 0];
        }
    }
    printf("1\n");
    // free(destinationData);
    free(sourceData);
    close(fp1);
}

// 放大显示左划右划
bool Zoom_Show_left_right_strokes(MEDIA_POI mp, P_AI p_ai, BMP_LINK bmp_p)
{
    if (mp == NULL || p_ai == NULL)
    {
        printf("参数为空\n");
        return false;
    }

    int x, y, x1, y1, ret_value;

    while (1)
    {
        ret_value = get_touch_action(mp, &x, &y, &x1, &y1);
        if (ret_value == -1)
        {
            printf("读取触摸屏坐标失败！\n");
            return false;
        }

        // 点击
        if (ret_value == 2)
        {
            if (x1 < 150 && x1 > 0) // 上一张
            {
                printf("上一张\n");
                bmp_p = bmp_p->prev;
                if (bmp_p == p_ai->bmp_list_head)
                {
                    bmp_p = bmp_p->prev;
                }
                
                show_bmp(mp,bmp_p->bmp_path,0,0);
            }
            else if (x1 > 650 && x1 < 800) // 下一张
            {
                printf("下一张\n");
                bmp_p = bmp_p->next;
                if (bmp_p == p_ai->bmp_list_head)
                {
                    bmp_p = bmp_p->next;
                }
                show_bmp(mp, bmp_p->bmp_path, 0, 0);
            }
            else
            {
                break;
            }
        }
        // 左划
        if (ret_value == 1) 
        {
            printf("下一张\n");
            bmp_p = bmp_p->next;
            if (bmp_p == p_ai->bmp_list_head)
            {
                bmp_p = bmp_p->next;
            }
            show_bmp(mp, bmp_p->bmp_path, 0, 0);
        }
        // 右滑
        if (ret_value == 0)
        {
            printf("上一张\n");
            bmp_p = bmp_p->prev;
            if (bmp_p == p_ai->bmp_list_head)
            {
                bmp_p = bmp_p->prev;
            }
            show_bmp(mp, bmp_p->bmp_path, 0, 0);
        }    
        
    }

    return true;
}

// 获取坐标并获取滑动坐标
int get_touch_action(MEDIA_POI mp, int *x1, int *y1, int *x2, int *y2)
{
    struct input_event buf;
    while (1)
    {
        read(mp->ts, &buf, sizeof(buf));
        if (buf.type == EV_ABS)
        {
            if (buf.code == ABS_X)
            {
                *x2 = buf.value * 800 / 1024;
            }
            if (buf.code == ABS_Y)
            {
                *y2 = buf.value * 480 / 600;
            }
        }
        if (buf.type == EV_KEY && buf.code == BTN_TOUCH)
        {
            if (buf.value == 1)
            { // 按下事件
                *x1 = *x2;
                *y1 = *y2;
            }
            else if (buf.value == 0)
            {
                if ((*x1 < 680) && (*x2 < 680) && (*x1 - *x2) < 0 && (*x2 - *x1) > 40 && abs(*y1 - *y2) < 40)
                { // 右滑
                    return 0;
                }
                else if ((*x1 < 680) && (*x2 < 680) && (*x1 - *x2) > 0 && (*x1 - *x2) > 40 && abs(*y1 - *y2) < 40) // 松开事件
                {                                                                                                  // 左划
                    return 1;
                }
                else if (abs(*x1 - *x2) < 5 && abs(*y1 - *y2) < 5)
                { // 点击
                    return 2;
                }
                else
                { // 其他情况，暂不考虑
                    return 3;
                }
            }
        }
    }

    return -1; // 错误状态
}
